#include <iostream>
#include <unistd.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <signal.h>
#include <sys/wait.h>
#include "account.h"


using namespace std;
//引入信号处理，避免僵尸进程
void sig_handler(int signo){
    if(signo==SIGCHLD){
        std::cout<<"子进程被回收"<<std::endl;
        wait(0);
    }
}


int main(){
    
    if(SIG_ERR==signal(SIGCHLD,sig_handler)){
        perror("signal");
        exit(1);
    }

    int shmid;
    if ((shmid = shmget(IPC_PRIVATE, sizeof(Account), IPC_CREAT | IPC_EXCL | 0777)) < 0)
    {
        perror("shmget error");
        exit(1);
    }

    //将物理内存映射成一块进程虚拟空间的地址
    Account*a=(Account*)shmat(shmid,0,0);
    if(a==(Account*)-1){
        perror("shmat");
        exit(1);
    }

    a->code=1001;
    a->balance=10000;

    pid_t pid;

    if((pid=fork())<0){
        perror("fork");
        exit(1);
    }else if(pid==0){
        double amt=withdraw(a,2000);

        std::cout<<"余额："<<a->code<<std::endl;
        shmdt(a);
    }else{
        //d对共享内存的操作，要在解除映射之前
        //父进程执行取款操作
        double amt=withdraw(a,1000);
    // 子进程不会继承父进程创建的共享内存，大家是共享的，子进程继承父进程映射的地址
        std::cout<<"余额："<<a->code<<std::endl;
        //完成映射要记得进行解除映射
        shmdt(a);
    }




    return 0;
}



